﻿//https://www.nowcoder.com/questionTerminal/d1ac7f15d5dc40b39a7d6cb11a01407e
#include <iostream>
#include <string>
using namespace std;
int main()
{
	int q;
	string s;
	cin >> q;
	while (q--)
	{
		cin >> s; // 把每个数当成字符串处理
		int n = s.size();
		for (int i = n - 1; i >= 0; i--)
		{
			if ((s[i] - '0') % 2 == 0)
			{
				swap(s[i], s[n - 1]);
				break;
			}
		}
		if ((s[n - 1] - '0') % 2 == 0) cout << s << endl;
		else cout << -1 << endl;
	}
	return 0;
}

//https://ac.nowcoder.com/acm/problem/229386

//算法思路：
//画出决策树，注意剪枝策略~

#include <iostream>
using namespace std;
const int N = 15;
int ret;
int n;
bool vis[N];
int arr[N];
void dfs(int pos)
{
	if (pos == n + 1) // 找到⼀种合法⽅案
	{
		ret++;
		return;
	}

	for (int i = 1; i <= n; i++)
	{
		if (vis[i]) continue; // 当前 i 已经放过了 - 剪枝
		if (vis[arr[i]]) return; // 剪枝
		vis[i] = true; // 相当于放上 i 号队员
		dfs(pos + 1);
		vis[i] = false; // 回溯- 还原现场
	}
}
int main()
{
	cin >> n;
	for (int i = 1; i <= n; i++) cin >> arr[i];
	dfs(1);
	cout << ret << endl;
	return 0;
}

//https://www.nowcoder.com/practice/da785ea0f64b442488c125b441a4ba4a?tpId=196&tqId=37050&ru=/exam/oj

//算法思路：
//树形dp：
//a.左⼦树收集：以左⼦树为起点的最⼤单链和；
//b.右⼦树收集：以右⼦树为起点的最⼤单链和；
//c.根节点要做的事情：整合左右⼦树的信息，得到经过根节点的最⼤路径和；
//d.向上返回：以根节点为起点的最⼤单链和

class Solution
{
public:
	int ret = -1010;

		int maxPathSum(TreeNode * root)
	{
		dfs(root);
		return ret;
	}
	int dfs(TreeNode* root)
	{
		if (root == nullptr) return 0;
		int l = max(0, dfs(root->left));// 左⼦树的最⼤单链和
		int r = max(0, dfs(root->right)); // 右⼦树的最⼤单链和
		// 经过root的最⼤路径和
		ret = max(ret, root->val + l + r);
		return root->val + max(l, r);
	}
};